package com.fy.market.types.common.ex;

import java.util.Collection;
import java.util.Objects;

/**
 * 异常处理工具类
 * 提供优雅的异常抛出方法，仅基于条件和消息字符串抛出异常
 * @date 2025-09-03
 * @author fwq
 */
public class ExHandler {

    /**
     * 如果条件为真，则抛出异常
     *
     * @param condition 条件（为true时抛出异常，支持任意布尔表达式结果）
     * @param errorMessage 异常消息
     */
    public static void throwIf(boolean condition, String errorMessage) {
        if (condition) {
            throw new ConditionException(errorMessage);
        }
    }

    /**
     * 直接抛出异常（无需条件判断）
     *
     * @param errorMessage 异常消息
     */
    public static void throwIf(String errorMessage) {
        throw new ConditionException(errorMessage);
    }

    /**
     * 如果条件为假，则抛出异常
     *
     * @param condition 条件（为false时抛出异常，支持任意布尔表达式结果）
     * @param errorMessage 异常消息
     */
    public static void throwIfNot(boolean condition, String errorMessage) {
        if (!condition) {
            throw new ConditionException(errorMessage);
        }
    }

    /**
     * 如果对象为空，则抛出异常
     *
     * @param obj 待校验对象（支持任意类型对象）
     * @param errorMessage 异常消息
     */
    public static void throwIfNull(Object obj, String errorMessage) {
        if (obj == null) {
            throw new ConditionException(errorMessage);
        }
    }

    /**
     * 如果对象不为空，则抛出异常
     *
     * @param obj 待校验对象（支持任意类型对象）
     * @param errorMessage 异常消息
     */
    public static void throwIfNotNull(Object obj, String errorMessage) {
        if (obj != null) {
            throw new ConditionException(errorMessage);
        }
    }

    /**
     * 如果字符串为空或空白（仅空格），则抛出异常
     *
     * @param str 待校验字符串
     * @param errorMessage 异常消息
     */
    public static void throwIfBlank(String str, String errorMessage) {
        // 处理null和空白字符串（包括全空格、制表符等空白字符）
        if (str == null || str.trim().isEmpty()) {
            throw new ConditionException(errorMessage);
        }
    }

    /**
     * 如果集合为空（null或无元素），则抛出异常
     *
     * @param collection 待校验集合（支持任意Collection子类，如List、Set等）
     * @param errorMessage 异常消息
     */
    public static void throwIfEmpty(Collection<?> collection, String errorMessage) {
        if (collection == null || collection.isEmpty()) {
            throw new ConditionException(errorMessage);
        }
    }

    /**
     * 如果数值大于指定阈值，则抛出异常
     *
     * @param value 待校验数值（支持Integer、Double、Float、Long等所有数值类型）
     * @param threshold 阈值（比较的基准值，支持所有数值类型）
     * @param errorMessage 异常消息
     */
    public static void throwIfGreaterThan(Number value, Number threshold, String errorMessage) {
        // 若任一数值为null则不触发异常（如需null时抛异常，可先调用throwIfNull校验）
        if (value != null && threshold != null && value.doubleValue() > threshold.doubleValue()) {
            throw new ConditionException(errorMessage);
        }
    }

    /**
     * 如果数值小于指定阈值，则抛出异常
     *
     * @param value 待校验数值（支持所有数值类型）
     * @param threshold 阈值（支持所有数值类型）
     * @param errorMessage 异常消息
     */
    public static void throwIfLessThan(Number value, Number threshold, String errorMessage) {
        if (value != null && threshold != null && value.doubleValue() < threshold.doubleValue()) {
            throw new ConditionException(errorMessage);
        }
    }

    /**
     * 如果数值等于指定目标值，则抛出异常
     *
     * @param value 待校验数值（支持所有数值类型）
     * @param target 目标值（支持所有数值类型）
     * @param errorMessage 异常消息
     */
    public static void throwIfEquals(Number value, Number target, String errorMessage) {
        if (value != null && target != null && value.doubleValue() == target.doubleValue()) {
            throw new ConditionException(errorMessage);
        }
    }

    /**
     * 如果数值不等于指定目标值，则抛出异常
     *
     * @param value 待校验数值（支持所有数值类型）
     * @param target 目标值（支持所有数值类型）
     * @param errorMessage 异常消息
     */
    public static void throwIfNotEquals(Number value, Number target, String errorMessage) {
        if (value != null && target != null && value.doubleValue() != target.doubleValue()) {
            throw new ConditionException(errorMessage);
        }
    }

    /**
     * 如果两个对象相等（equals判断），则抛出异常
     *
     * @param obj1 对象1（支持任意类型）
     * @param obj2 对象2（支持任意类型）
     * @param errorMessage 异常消息
     */
    public static void throwIfEquals(Object obj1, Object obj2, String errorMessage) {
        if (Objects.equals(obj1, obj2)) {
            throw new ConditionException(errorMessage);
        }
    }

    /**
     * 如果两个对象不相等（equals判断），则抛出异常
     *
     * @param obj1 对象1（支持任意类型）
     * @param obj2 对象2（支持任意类型）
     * @param errorMessage 异常消息
     */
    public static void throwIfNotEquals(Object obj1, Object obj2, String errorMessage) {
        if (!Objects.equals(obj1, obj2)) {
            throw new ConditionException(errorMessage);
        }
    }

}